home *** CD-ROM | disk | FTP | other *** search
- PMTeX
- A Preprocessor for MusicTeX
- by Don Simons (dsimons@logicon.com)
-
- INTRODUCTION
- PMTeX will generate MusicTeX code for multi-staff scores with up to
- five staves (or voices) per system. Once it makes a .tex file for you,
- you will probably want or need to change a few things manually. This is
- because (a) PMTeX only has a small subset of the capabilities of
- MusicTeX, and (b) PMTeX is not perfect. But it can save a LOT of time
- with the grunge work involved in setting up notes...enotes groupings,
- defining beams, justifying lines, and spreading the entire piece evenly
- over a specified number of systems.
- PMTeX can deal with one and only one melody per staff (voice). It
- won't let you change the time signature or key signature within a piece.
- Except the first bar, every bar in each staff must have exactly the
- number of beats specified by the input parameter mtrnum. On the first
- pass pmtexa will choke if these timings or just about anything else is
- askew in the input. The error messages are not especially pointed, so
- it is best to enter only a few bars at a time, run pmtexa, correct
- errors, rerun, etc.
- You can enter note values and rests from whole notes to 32nds, and
- trills and mordents. Since I'm interested in baroque chamber music, I
- built in the ability to notate figured bass below the bottom staff in
- each system.
-
- SETUP
- The distribution contains the files pmtexa.for, pmtexb.for,
- pmtex.inc, sample.inp, and pmtex.tex. First compile the two FORTRAN
- programs (with the .inc file accessible to the compiler). I used
- Microsoft FORTRAN to develop the code, and have checked that it works on
- an IBM RISC 6000 when compiled with xlf. I hope the code is generic
- enough that it will work with other systems. Put the executables either
- in your working directory or somewhere in the path. Put pmtex.tex into
- the texinput directory. Put sample.inp into your working directory (the
- one from which you will run PMTeX. Edit the 7th line of sample.inp to
- contain the path to the texinput directory; the code will put the .tex
- file there. If you want this to be the same as the working directory,
- type '.\' for DOS, or './' for UNIX (don't type the quotes). If you
- have a conventional PCTeX setup you would enter 'c:\pctex\texinput\',
- etc. Next run the first pass by typing 'pmtexa'. You will be prompted
- for a basename; for the sample it is 'sample'. If pmtexa runs
- successfully it will generate two files in the working directory,
- pmtex.fig and pmtex.dat. Next run pmtexb by typing 'pmtexb'. This will
- put sample.tex and sample.fig into the texinput directory (.fig only if
- you have figured bass). Now you are right where you would be after
- manually entering, debugging, and rough-editing any .tex file. To see
- the results, 'tex' the file sample.tex. You'll notice that two systems
- on each of the two pages are a little too long. That's not your fault;
- I left things that way just to PROVE that PMTeX isn't perfect. To fix
- them, manually increase the first autolines parameter for each of these
- lines by one.
-
- WHAT GOES INTO AN INPUT FILE
- Let's just go through sample.inp. It will take a while, but we'll
- cover practically all the possible inputs. For reference, here are the
- first 9 lines of the file:
-
- 3 3 4 4 6 1 3
- 5 10 20 0.07
- Basso
- Violin II
- Violin I
- btt
- c:\pctex\texinput\
- % read(10,*)nv,noinst,mtrnum,mtrden,imeter,xmtrnum0,isig,
- % * lpp,nstaves,musicsize,fracindent
-
- These are the setup data. The lines with % in column 1 are comments.
- You can only put comments AFTER the end of the initial data section.
- Starting in the first line,
-
- nv (integer<6) is the number of voices, or staves per system.
-
- noinst (integer<6) is number of 'instruments'. All this does is choose
- whether you want a brace in front of each system (noinst=1) or not
- (noinst>1).
-
- mtrnum is the numerator of the time signature, mtrden the denominator.
- So far I've only tested 3/4, 6/8, 2/2, 2/4, and 4/4 but others may
- work.
-
- imeter determines how the time signature looks:
- 0 Fraction
- 2, 3, or 4 Just that number, between the 2nd and 4th lines
- 5 Common time
- 6 Cut time (alla breve)
-
- xmtrnum0 is the number of beats in the first bar, but only if there's
- a pickup; otherwise set it to 0 . I had intended fractions to work
- but they don't seem to, just integers. The first bar is the ONLY
- bar that can have a different number of beats.
-
- isig is the key signature, positive integer for sharps, negative for
- flats.
-
- lpp is the number of systems per page.
-
- nstaves is a misnomer (I just realized): it's really the total number of
- systems in the whole piece. Leftovers start at the front, so for
- example if lpp=3 and nstaves=5 there will 3 systems on the first
- page. WARNING: if you are building an input file one gulp at a
- time, you will have to adjust this parameter to roughly reflect the
- CURRENT number of staves. If nstaves is too big for the current
- number of bars. the code will choke.
-
- musicsize is 20 or 16 (height of a staff in points).
-
- fracindent is the fraction of the total line width to indent the first
- line.
-
- Next come the names of the nv instruments as you want them to
- appear within the indentation in the first system, one per line,
- starting with the BOTTOM voice. Then a string of nv letters for the
- clefs, again starting with the bottom voice: 'b' for bass, 'a' for alto,
- 't' for treble.
- Line 7 in sample.inp is the last of the setup data, the path to the
- .tex directory, where you want sample.tex to go when pmtex makes it.
- The rest of sample.inp is the body of the input. You feed it music in
- gulps of an integral number of bars, usually 4 to 8. If you give it too
- big a gulp, it will choke (due to dimension limits), and there aren't
- any internal dimension checks. (I've been bitten by this one myself).
- Each gulp has some stuff for a few bars of the first (lowest) voice,
- then a '/', then the second voice for EXACTLY the same number of bars,
- another '/', and so on for nv voices. When the last (top) voice
- finishes (with a '/') the gulp is ready for digestion.
- The stuff for each voice is a sequence of "symbols" of one or more
- adjacent characters, separated by spaces. Separate the voice-
- terminating '/' with spaces just to be safe.
- Note symbols always start with a letter and end at the first space.
- The letter has the obvious meaning (unlike another entry system we all
- know about, which unfortunately I could never get comfortable with and
- believe me I did try but I guess I'm getting too old). Next is a digit
- for the octave...middle C is c4, the B just below is b3. If a note is
- the same length and within a fourth of its predecessor, the symbol can
- be one letter only, provided it doesn't have an accidental. This makes
- it really easy to enter long strings of scalewise or even arpeggiated
- notes of equal value: letter,space,letter,space... If a note is the
- same length but more than a fourth away from its predecessor, and again
- no accidental, the note symbol can be just two characters long, the note
- name and the octave. Next comes a digit for the length (if needed): 0
- for whole, 2 for half, 4 for quarter, 8 for eighth, 1 for sixteenth, and
- 3 for thirty-second notes (with credit to Dr. T's Copyist Apprentice, my
- first foray into notation programs. Actually it seems really cool to me
- that these digits don't bump into each other but still cover all normal
- possibilities.) (Sorry, we don't do triplets. If you just have a few
- triplets, enter something else and fix them by hand later. If there are
- a lot of triplets you could try using a separate file for that section,
- faking out the code with a different time signature--say 6/8 instead of
- 2/4--then manually merging the .tex files later.) The next two
- characters (if needed) are letters to signal a dot ('d') and/or
- accidental ('f':flat, 'n':natural, 's':sharp). If both are present they
- can be in either order. If either is present then the first three
- characters--note, octave, duration--are required. Don't enter an
- accidental if it's in the key signature. Advanced users can change the
- behavior of the accidentals to 'smart' (transposable) from literal (the
- default) by editing pmtex.tex. (With the baroque convention for
- accidentals, 'smart' ones don't work even if you're not transposing!)
- The code tries to put in extra horizontal space if needed to make room
- for accidentals.
- After a note symbol goes any associated ornament or figure. The
- only ornaments are trill ('ot') and mordent ('om'). (Minimal
- programming could expand this list, but I haven't needed any others).
- All accidentals will come out just high enough above the staff not to
- crash into their notes.
- A rest symbol has two characters, just 'r' followed by a digit for
- its length, using the same code as for note values.
-
- FIGURED BASS
- Figure symbols follow their associated note symbols. They only
- work in the first (lowest) voice. Enter the characters as they would
- appear from top to bottom, and as you might pronounce them, e.g., '64'
- or '73'. Flats here are '-' (minus), sharps are '#', and naturals 'n',
- BEFORE the number (if there is a number) (perversity or absentmindedness
- is why they're different here than in note symbols). So six (over) flat
- five is '6-5' as in the first line of the body of sample.inp, and sharp
- six (over) 4 is '#64'. The program prints all the figures for each
- system below the lowest staff, with their tops aligned, and just low
- enough to clear the lowest beam, notehead, or stem that could interfere.
- (This was kind of tricky to program!)
-
- A WORD ABOUT SLURS AND TIES
- There's no provision for them in PMTeX. Why? I handle them with
- another code that post-processes the postscript file. That code will
- only run on a PC with VGA graphics. If there is interest, I'll
- distribute it later. But for now, sorry, you're on your own. At worst,
- you can enter MusicTeX slur codes manually.
-
- TH-TH-THAT'S ALL, FOLKS
- There's not much more to say about basic care and feeding of PMTeX.
- One suggestion worth repeating is to enter just a few bars at a time,
- and at least run them through pmtexa to get rid of typos. If you wanted
- to type a lot at once, you could comment out all gulps but the first,
- then delete comment symbols a gulp at a time, letting PMTeX digest the
- gulps one-by-one. Unless you never make mistakes.
- Please hit me with questions, bugs, and comments. I'll consider
- suggestions for additions as time and inclination permit. I am thinking
- about improving the input checking in pmtexa. There is one thing I hope
- I don't hear: that after trying the program you think my silly
- gastrointestinal metaphor should be carried to its logical "end" when
- describing PMTeX's output.
-